﻿// ***** Lấy dữ liệu từ *****
// Catalogue_Department
// Catalogue_Level
// Catalogue_Major
// Catalogue_TrainingType
// Training_Student_Class
// Training_Student

// ***** Cập nhật dữ liệu vào bảng *****
// Training_Student_Class

using System;
using System.Windows.Forms;
using UniMana.Utils.Data;
using System.Linq;
using UniMana.Utils.Configs;
using System.Data;
//using UniMana.GUI.Training.StudentManagement;
using DevExpress.XtraEditors;
using UniMana.Data;

namespace UniMana.Win.Training
{
    public partial class FrmStudent_Class : DevExpress.XtraEditors.XtraForm
    {
        private int m_iTraining_ClassKey = 0;
        private Training_ClassInfo clsInfo;

        private BindingSource m_bdsStudent = new BindingSource();
        private BindingSource m_bdsStudentClass = new BindingSource();

        private DBMain m_data = new DBMain();

        public DevExpress.Utils.WaitDialogForm dlg;

        public FrmStudent_Class(int m_iTraining_ClassKey)
        {
            //if (!UniMana.Lib.Sys.Utils.CheckAccessByRule(Utils.Config.RuleConfig.LDV))
            //{
            //    return;
            //}
            InitializeComponent();
            this.m_iTraining_ClassKey = m_iTraining_ClassKey;
        }

        private void FrmStudent_Class_Load(object sender, EventArgs e)
        {
            cmbIDprefixLast.Text = "0000";
            txtIDprefixFirst.Enabled = false;
            LoadData();
            LoadStudent();
            LoadStudentClass();
        }

        /// <summary>
        /// Load dữ liệu lên form
        /// </summary>
        
        public void LoadData()
        {
            try
            {
                DataTable m_tblPerson = new DataTable();
                m_tblPerson = m_data.m_DCReadOnly.Personnel_Personnels.GetPersonnelKeyIDLastNameName().ToDataTable();
                if (m_tblPerson.Rows.Count > 0)
                {
                    gluPersonnel_Personnel.GetData(m_tblPerson, "Personnel_PersonnelKey", "FullName");
                }
                gluTraining_Class.GetData(m_data.m_DCReadOnly.Training_Classes, "Training_ClassKey", "ID");
                clsInfo = new Training_ClassInfo(m_iTraining_ClassKey);
                if (clsInfo.Properties.Training_ClassKey > 0)
                    txtClassName.Text = clsInfo.Properties.Name;

                try
                {
                    gluPersonnel_Personnel.EditValue = Guid.Parse(clsInfo.Properties.Personnel_PersonnelKey.ToString());
                }
                catch
                {
                    gluPersonnel_Personnel.EditValue = null;
                }
                gluTraining_Class.EditValue = m_iTraining_ClassKey;
                rluCatalogue_Major.GetData(m_data.m_DCReadOnly.Catalogue_Majors);
                rluCatalogue_Status.GetData(m_data.m_DCReadOnly.Catalogue_Status);
            }
            catch { }
        }

        /// <summary>
        /// Hàm kiểm tra mã mẫu
        /// </summary>
        /// <returns></returns>

        private int CheckModelID()
        {
            if (txtIDprefixFirst.Text != "")
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }

        /// <summary>
        /// Hàm kiểm tra số sinh viên vượt số sinh viên cho phép trong lớp
        /// </summary>
        /// <returns></returns>

        private int CheckStudentCount(int m_iStudentCountSelect, int m_iStudentCountInClass, int m_iStudentCountMax)           
        {
            if (((m_iStudentCountSelect + m_iStudentCountInClass) - m_iStudentCountMax) > 0)
                return (m_iStudentCountSelect + m_iStudentCountInClass) - m_iStudentCountMax;
            else
                return 1;
        }

        /// <summary>
        /// Lấy thông tin sinh viên thỏa điều kiện
        /// </summary>

        private void LoadStudent()
        {
            try
            {
                m_bdsStudent.DataSource = m_data.m_DCReadOnly.Training_Students.GetStudentNotInClassByMajorTrainingTypeCourseLevel(m_data.m_DCReadOnly.Training_Student_Classes,
                    int.Parse(clsInfo.Properties.Catalogue_MajorKey.ToString()),
                    int.Parse(clsInfo.Properties.Catalogue_TrainingType.ToString()),
                    int.Parse(clsInfo.Properties.Catalogue_CourseKey.ToString()),
                    int.Parse(clsInfo.Properties.Catalogue_LevelKey.ToString()));
                if (m_bdsStudent.Count != 0)
                    gctStudent.DataSource = m_bdsStudent.DataSource;               
                else
                    gctStudent.DataSource = null;
                grbStudentList.Text = "Danh sách sinh viên có " + m_bdsStudent.Count.ToString() + " sinh viên";
            }
            catch { }
        }

        /// <summary>
        /// Lấy sinh viên đã xếp lớp
        /// </summary>

        private void LoadStudentClass()
        {
            try
            {
                this.m_bdsStudentClass.DataSource = m_data.m_DCReadOnly.Training_Students.GetStudentInClassByMajorTrainingTypeCourseLevel(m_data.m_DCReadOnly.Training_Student_Classes,
                    int.Parse(clsInfo.Properties.Catalogue_MajorKey.ToString()),
                    int.Parse(clsInfo.Properties.Catalogue_TrainingType.ToString()),
                    int.Parse(clsInfo.Properties.Catalogue_CourseKey.ToString()),
                    int.Parse(clsInfo.Properties.Catalogue_LevelKey.ToString()),
                    int.Parse(clsInfo.Properties.Training_ClassKey.ToString()));
                if (this.m_bdsStudentClass.Count != 0)
                {
                    this.gctStudentClass.DataSource = this.m_bdsStudentClass.DataSource;
                    txtIDprefixFirst.Enabled = false;
                }
                else
                {
                    this.gctStudentClass.DataSource = null;
                    txtIDprefixFirst.Enabled = true;
                }
                grbStudentClassList.Text = "Danh sách sinh viên lớp : " + clsInfo.Properties.ID + " có " + this.m_bdsStudentClass.Count.ToString() + " sinh viên";
            }
            catch { }
        }

        /// <summary>
        /// Hàm xếp sinh viên vào lớp
        /// </summary>

        private void AddStudentInClass()
        {
            if (grvStudent.SelectedRowsCount > 0)
            {
                int _dd = 0;
                dlg = new DevExpress.Utils.WaitDialogForm(MsgConfig.MSG_WAIT, MsgConfig.MSG_LOADING);
                int[] index = grvStudent.GetSelectedRows();
                for (int i = 0; i < index.Length; i++)
                {
                    Training_Student_ClassInfo stclass = new Training_Student_ClassInfo("nguyen.tuanan",
                        this.grvStudent.GetRowCellValue(index[i], "Training_StudentKey").ToString(),
                        int.Parse(clsInfo.Properties.Catalogue_LevelKey.ToString()),
                        int.Parse(clsInfo.Properties.Catalogue_MajorKey.ToString()),
                        int.Parse(clsInfo.Properties.Catalogue_TrainingType.ToString()),
                        int.Parse(clsInfo.Properties.Catalogue_CourseKey.ToString()));
                    if ((stclass.Properties.Catalogue_CourseKey > 0) && (stclass.Properties.Training_ClassKey != null))
                    {
                        _dd = 1;
                        dlg.Close();
                        DialogResult result = XtraMessageBox.Show("Một số sinh viên vừa được xếp lớp" + "\n" + "Cần làm mới lại dữ liệu.", "Thông báo", MessageBoxButtons.YesNo);
                        if (result == DialogResult.Yes)
                        {
                            LoadStudent();
                            LoadStudentClass();
                            break;
                        }
                        else
                            break;
                    }
                    stclass.Properties.Training_ClassKey = clsInfo.Properties.Training_ClassKey;
                    try
                    {
                        stclass.Properties.Training_TrainingProgramKey = m_data.m_DCReadOnly.Training_TrainingPrograms.ReturnTrainingProgramWithTrainingTypeMajorLevelCourse(int.Parse(clsInfo.Properties.Catalogue_TrainingType.ToString()),
                            int.Parse(clsInfo.Properties.Catalogue_MajorKey.ToString()),
                            int.Parse(clsInfo.Properties.Catalogue_LevelKey.ToString()),
                            int.Parse(clsInfo.Properties.Catalogue_CourseKey.ToString()));
                    }
                    catch
                    {
                        XtraMessageBox.Show("Không thể thêm sinh viên " + this.grvStudent.GetRowCellDisplayText(index[i], "LastName").ToString() + " " + this.grvStudent.GetRowCellDisplayText(index[i], "SureName").ToString() + " vào lớp.\n(Không thể xác định được chương trình đào tạo)", "Thông báo");
                        continue;
                    }
                    if (ckeKeep.Checked == false)
                    {
                        stclass.Properties.ID = AutoCreateStudentID.Create(m_data.m_DCReadOnly.Training_Student_Classes,
                            int.Parse(clsInfo.Properties.Catalogue_MajorKey.ToString()),
                            int.Parse(clsInfo.Properties.Catalogue_TrainingType.ToString()),
                            int.Parse(clsInfo.Properties.Catalogue_CourseKey.ToString()),
                            int.Parse(clsInfo.Properties.Catalogue_LevelKey.ToString()),
                            int.Parse(clsInfo.Properties.Training_ClassKey.ToString()),
                            txtIDprefixFirst.Text, cmbIDprefixLast.Text);
                    }
                    stclass.Save();
                }
                if (_dd == 0)
                    dlg.Close();
            }
        }

        /// <summary>
        /// Thêm sinh viên đăng ký vào lớp
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void btnAdd_Click(object sender, EventArgs e)
        {
            try
            {
                if (((txtIDprefixFirst.Enabled == true) && (txtIDprefixFirst.Text == "")))
                    XtraMessageBox.Show("Chưa chọn mã mẫu cho sinh viên");
                else
                {
                    if (grvStudent.SelectedRowsCount > 0)
                        AddStudentInClass();
                    else
                        XtraMessageBox.Show("Chưa chọn sinh viên", "Thông báo");
                    LoadStudent();
                    LoadStudentClass();
                }
            }
            catch { XtraMessageBox.Show("Lỗi", "Thông báo"); }
        }

        private int CheckRemoveStudentInClass(string m_strTraining_StudentKey, int m_iTrainingClassKey)
        {
            return 1;
        }

        /// <summary>
        /// Xóa sinh viên đã đăng ký lớp
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void btnRemove_Click(object sender, EventArgs e)
        {
            try
            {
                if (grvStudentClass.SelectedRowsCount > 0)
                {
                    dlg = new DevExpress.Utils.WaitDialogForm(MsgConfig.MSG_WAIT, MsgConfig.MSG_LOADING);
                    int[] index = grvStudentClass.GetSelectedRows();
                    for (int i = 0; i < index.Length; i++)
                    {
                        // Kiểm tra sinh viên đang còn học
                        if (int.Parse(this.grvStudentClass.GetRowCellValue(index[i], "Catalogue_StatusKey").ToString()) == 1)
                        {
                            Training_Student_ClassInfo stclass = new Training_Student_ClassInfo(this.grvStudentClass.GetRowCellValue(index[i], "Training_StudentKey").ToString(),
                                int.Parse(clsInfo.Properties.Catalogue_LevelKey.ToString()),
                                int.Parse(clsInfo.Properties.Catalogue_MajorKey.ToString()),
                                int.Parse(clsInfo.Properties.Catalogue_TrainingType.ToString()),
                                int.Parse(clsInfo.Properties.Catalogue_CourseKey.ToString()),
                                int.Parse(clsInfo.Properties.Training_ClassKey.ToString()));
                            Training_Student_SubjectInfo stdsubinfo = new Training_Student_SubjectInfo(this.grvStudentClass.GetRowCellValue(index[i], "Training_StudentKey").ToString(),
                                "nguyen.tuanan");
                            if (stdsubinfo.Properties.Training_Student_SubjectKey > 0)
                                XtraMessageBox.Show("Sinh viên " + this.grvStudentClass.GetRowCellValue(index[i], "LastName").ToString() + " " + this.grvStudentClass.GetRowCellValue(index[i], "SureName").ToString() + " đã đăng ký học. Không thể xóa ra khỏi lớp");
                            else
                            {
                                stclass.Properties.Training_ClassKey = null;
                                if (ckeKeep.Checked == false)
                                    stclass.Properties.ID = null;
                                stclass.Save();
                            }
                        }
                        else
                            XtraMessageBox.Show("Sinh viên " + this.grvStudentClass.GetRowCellValue(index[i], "LastName").ToString() + " " + this.grvStudentClass.GetRowCellValue(index[i], "SureName").ToString() + " không còn trong thời gian lớp quản lý. Không thể xóa khỏi lớp");
                    }
                    dlg.Close();
                }
                else
                    XtraMessageBox.Show("Chưa chọn sinh viên", "Thông báo");
                LoadStudent();
                LoadStudentClass();
            }
            catch
            {
                dlg.Close();
                XtraMessageBox.Show("Lỗi", "Thông báo");
            }
        }

        private void gluTraining_Class_EditValueChanged(object sender, EventArgs e)
        {
            m_iTraining_ClassKey = int.Parse(gluTraining_Class.EditValue.ToString());
            clsInfo = new Training_ClassInfo(m_iTraining_ClassKey);
            if (clsInfo.Properties.Training_ClassKey > 0)
                txtClassName.Text = clsInfo.Properties.Name;
            try
            {
                gluPersonnel_Personnel.EditValue = Guid.Parse(clsInfo.Properties.Personnel_PersonnelKey.ToString());
            }
            catch
            {
                gluPersonnel_Personnel.EditValue = null;
            }
            LoadStudent();
            LoadStudentClass();
        }

        /// <summary>
        /// Hàm tự động chia sinh viên vào lớp
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        //private void btnAuto_Click(object sender, EventArgs e)
        //{
        //    try
        //    {
        //        if (txtClassID.Text == "")
        //        {
        //            if (CheckInfo() == 1)
        //            {
        //                if (m_bdsClass.DataSource != null)
        //                {
        //                    if (lbcStudentCountNotInClass.Text != "0")
        //                    {
        //                        if (txtStudentCountMax.Text != "")
        //                        {
        //                            dlg = new DevExpress.Utils.WaitDialogForm(MsgConfig.MSG_WAIT, MsgConfig.MSG_LOADING);
        //                            int _d = 0;
        //                            while (lbcStudentCountNotInClass.Text != "0")
        //                            {
        //                                for (int i = 0; i < int.Parse(lbcClassSum.Text); i++)
        //                                {
        //                                    _d = i + 1;
        //                                    if (CheckClassFullStudent(int.Parse(this.grvClass.GetRowCellValue(i, "Training_ClassKey").ToString()), int.Parse(txtStudentCountMax.Text)) > 0)
        //                                    {
        //                                        UniMana.Lib.StudentClass.Training_Student_ClassInfo stclass = new UniMana.Lib.StudentClass.Training_Student_ClassInfo(grvStudent.GetRowCellValue(0, "Training_StudentKey").ToString(), m_iLevelKey, m_iMajorKey, m_iTrainingTypeKey, m_iCourseKey);
        //                                        stclass.Properties.Training_ClassKey = int.Parse(this.grvClass.GetRowCellValue(i, "Training_ClassKey").ToString());
        //                                        stclass.Properties.ID = AutoCreateStudentID.Create(m_data.m_DCReadOnly.Training_Student_Classes, m_iMajorKey, m_iTrainingTypeKey, m_iCourseKey, m_iLevelKey, Convert.ToInt16(this.grvClass.GetRowCellValue(i, "Training_ClassKey").ToString()), this.grvClass.GetRowCellValue(i, "ID").ToString(), cmbIDprefixLast.Text);
        //                                        stclass.Save();
        //                                        LoadStudent();
        //                                        LoadStudentClass();
        //                                        DisPlayInformattion();
        //                                        break;
        //                                    }
        //                                }
        //                                if ((_d == int.Parse(lbcClassSum.Text)) && (CheckClassFullStudent(int.Parse(this.grvClass.GetRowCellValue(int.Parse(lbcClassSum.Text) - 1, "Training_ClassKey").ToString()), int.Parse(txtStudentCountMax.Text)) <= 0))
        //                                {
        //                                    XtraMessageBox.Show("Các lớp đã đủ sinh viên theo số lượng qui định");
        //                                    dlg.Close();
        //                                    return;
        //                                }
        //                            }
        //                            dlg.Close();
        //                        }
        //                        else
        //                        {
        //                            XtraMessageBox.Show("Chưa nhập số sinh viên tối đa cho lớp");
        //                        }
        //                    }
        //                    else
        //                    {
        //                        XtraMessageBox.Show("Đã hết sinh viên để xếp lớp");
        //                    }
        //                }
        //                else
        //                {
        //                    XtraMessageBox.Show("Chưa có thông tin lớp để xếp sinh viên vào lớp");
        //                }
        //            }
        //            else
        //            {
        //                XtraMessageBox.Show("Chưa chọn đầy đủ thông tin", "Thông báo");
        //            }
        //        }
        //        else
        //        {
        //            XtraMessageBox.Show("Chức năng chia lớp tự động không dùng khi tìm theo mã lớp");
        //        }
        //    }
        //    catch { }
        //}

        /// <summary>
        /// Nhấp chọn để xem thông tin sinh viên
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void gctStudentClass_Click(object sender, EventArgs e)
        {
            try
            {
                //////DevExpress.Utils.WaitDialogForm dlg = new DevExpress.Utils.WaitDialogForm(MsgConfig.MSG_WAIT, MsgConfig.MSG_LOADING);
                //////string currentKey = grvStudentClass.GetFocusedRowCellValue("Training_StudentKey").ToString();
                //////int currentMajor = int.Parse(grvStudentClass.GetFocusedRowCellValue("Catalogue_MajorKey").ToString());
                //////FrmStudent_Info frmInfo = new FrmStudent_Info();
                //////UniMana.Lib.Student.Training_StudentInfo studentInfo = new UniMana.Lib.Student.Training_StudentInfo(currentKey);
                //////Training_Student_CheckListInfo studentCheckListInfo = new Training_Student_CheckListInfo(currentKey);
                //////UniMana.Lib.Student.Training_Student_ClassInfo studentClass = new UniMana.Lib.Student.Training_Student_ClassInfo(currentKey, currentMajor);

                //////frmInfo.m_StudentInfo = studentInfo;
                //////frmInfo.m_CheckListInfo = studentCheckListInfo;
                //////frmInfo.m_StudentClass = studentClass;

                ////////frmInfo.m_Flag = false;
                //////dlg.Close();

                //////frmInfo.ShowDialog();
            }
            catch (Exception ex) { XtraMessageBox.Show(ex.Message); }
        }

        private void btnExport_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFile = new SaveFileDialog();
            saveFile.Filter = "*.xlsx | *.xls";
            saveFile.Title = "Lưu tập tin excel 2007";
            if (saveFile.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                grvStudentClass.ExportToXlsx(saveFile.FileName);
            }
        }

        private void btnEditStudentID_Click(object sender, EventArgs e)
        {
            if (grvStudentClass.SelectedRowsCount > 0)
            {
                int[] index = grvStudentClass.GetSelectedRows();
                //int aaa = index.Count();
                if (index.Count() == 1)
                {
                    FrmStudent_Class_Edit_StudentID editID = new FrmStudent_Class_Edit_StudentID(this.grvStudentClass.GetRowCellValue(index[0], "Training_StudentKey").ToString(),
                        clsInfo.Properties.Training_ClassKey);
                    editID.ShowDialog();
                    // Load lại sinh viên trong lớp
                    LoadStudentClass();
                }
                else
                    XtraMessageBox.Show("Chỉ được phép chọn 1 sinh viên");
            }
            else
                XtraMessageBox.Show("Chưa chọn sinh viên");
        }

        private void gluPersonnel_Personnel_EditValueChanged(object sender, EventArgs e)
        {

        }
    }
}
